import random
import time
import matplotlib.pyplot as plt
import matplotlib

random.seed(1)


def generate():
    alphabet = "ABCDEFGHIJKLMNO"
    d = {}
    for i in range(15):
        d[alphabet[i]] = random.randint(35, 100) #alphabet[i]就是字符串中的每一个字符，字符是键，d[字符]就是在查找字典中的值
    print("dict: " + str(d))
    return d
'''生成15位学生成绩字典'''


def sort_dict(dct):
    sorted_dict = []
    items = list(dct.items()) #items函数输出的是字符串，需要换格式。items是将字典中的元素转换为列表方便排序
    for i in range(15):
        max = 0
        index = 0
        for j in items:
            if int(j[1]) > max:
                max = int(j[1])
                index = items.index(j) #返回items中j元素的索引
        sorted_dict.append(items.pop(index)) #追加元素
    print("sorted_dict: " + str(sorted_dict)) #移除元素
    return sorted_dict
'''生成已经排序好的学生成绩列表'''


def cal(lst):
    sum = 0
    fails = 0
    for i in lst:
        sum += i[1]
        if i[1] < 60:
            fails += 1
    print("平均分: {0:.2f}, 最大值: {1}, 最小值: {2}".format(sum/15, lst[0][1], lst[-1][1]).center(100, "*"))
    print("不及格人数: " + str(fails))
    return sum
'''计算学生平均分等详细信息'''


def search(a, d): #设置两个参数，一个用于比较，一个用于调用回第1步的字典
    search_times = 0
    while True:
        name = input("请输入学生名字: 输入0后退出")
        t1 = time.perf_counter()
        if name == str(0):
            break
        search_times += 1
        try: #异常处理
            score = d[name]
            print("该生成绩为：", score)
            if score > a:
                print("该生成绩属于上等水平")
            elif score == a:
                print("该生成绩属于中等水平")
            else:
                print("该生成绩属于下等水平")
        except KeyError:
            print("请输入正确的学生姓名")
        t2 = time.perf_counter()
        print("查询用时为:", t2 - t1 )
        t = time.localtime()
        c = time.strftime('%Y-%m-%d %H:%M:%S', t)
        print("查询时的时间为：", c)
    print("查询次数为：", search_times)
'''生成查找学生成绩系统并输出查询时间和次数'''


def draw(lst):
    #先设定成绩区间
    failed = 0
    passed = 0
    excellent = 0
    for i in lst:
        if i[1] < 60:
            failed += 1
        elif 60 <= i[1] < 80:
            passed += 1
        else:
            excellent += 1
    matplotlib.rcParams['font.family'] = 'SimHei'
    x = ["不及格", "及格", "优秀"]
    y = [failed, passed, excellent]
    plt.title("成绩分布区间")
    for i in range(3):
        plt.bar(x[i], y[i]) #在for循环里面
        plt.text(i, y[i], y[i]) #（i表示x坐标， y[i]表示y坐标， y[i]表示个数）
    plt.show()
'''使用第三方库matplotlib绘画学生成绩分布区间图'''


def main():
    while True:
        command = input("请输入数字\n1为学生成绩\n2为学生排序成绩\n3为学生平均分等详细信息\n4为查询学生成绩\n5为成绩区间图\n0为结束程序")
        if command == "1":
            d = generate()
        elif command == "2":
            try: #异常处理：输入1之后才能使用2
                sorted_dict = sort_dict(d)
            except UnboundLocalError: #出现黄色波浪线的原因是没有标明是出现什么错误情况
                print("使用2之前请使用1")
        elif command == "3":
            try:
                sum = cal(sorted_dict) #没使用sort_dict之前不能使用sorted_dict
            except UnboundLocalError:
                print("使用3之前请使用2")
        elif command == "4":
            try:
                average = round(sum/15)
                search(average, d)
            except UnboundLocalError:
                print("使用4之前请使用3")
        elif command == "5":
            try:
                draw(sorted_dict)
            except UnboundLocalError:
                print("使用5之前请使用2")
        elif command == "0":
            break
        else:
            print("未知指令，请重新输入")
'''生成菜单'''

main()
